// ============================== 导入依赖 ============================== //

import CORE from '../UTIL'
import util from './util'

// ============================== 状态集 ============================== //

const state = {
  // —————————————————————————————— 数据 —————————————————————————————— //

  /**
   * 接口
   */
  API: {
    ...util.API,
    validSelectParam(selectParam, state, root) {
      return true
    },
    transSelectParam(selectParam, context) {
      return selectParam
    },
    getSelect: null,
    transSelect(arr, context) {
      return arr
    },
  },

  /**
   * 映射
   */
  MAP: {
    WORD: '', // 词语 (初始常量，不可更新)

    GET: null, // 获取 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    SELECT: null, // 下拉框 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')

    tipSelect: '', // 下拉框提示 (有值时直接使用，无值时拼接生成)
  },

  /**
   * 字典
   */
  DICT: {
    //
  },

  /**
   * 初始配置
   */
  INIT_CONFIG: {
    /**
     * 是否为单例下拉框
     *
     * true  单例下拉框 (只在原有数组上增改删)
     * false 普通下拉框 (每次 setTree 生成新数组)
     */
    IS_SINGLE_SELECT: false,
  },

  /**
   * 下拉框字段 ( 可增加，示例 ['id', 'name', 'other', (item) => () => item.status !== 1] )
   */
  SELECT_FIELD: ['id', 'name'],

  /**
   * 下拉框参数
   */
  selectParam: { page: 1 },

  /**
   * 下拉框
   */
  select: [],

  /**
   * 选中项
   */
  chosen: {},

  // —————————————————————————————— 弹窗 —————————————————————————————— //

  /**
   * 弹窗可见
   */
  selectVisible: false,

  // —————————————————————————————— 开关 —————————————————————————————— //

  /**
   * 远程下拉框开关
   */
  needSelect: false,

  /**
   * 下拉框就绪开关
   */
  readySelect: false,
}

// ============================== 计算属性 ============================== //

const getters = {
  /**
   * 下拉框字典 [[id, name, other], [id, name, other]]
   */
  selectDict: ({ select, SELECT_FIELD }) => {
    return select.map((item) => {
      const trans = (field) => CORE.isFunction(field) ? field(item) : (field ? item[field] : '')
      return SELECT_FIELD.map(trans)
    })
  },
}

// ============================== 同步更新 ============================== //

const mutations = {
  // —————————————————————————————— 设置 —————————————————————————————— //

  /**
   * 设置下拉框
   */
  setSelect(state, select) {
    setStateSelect(state, select)
  },

  /**
   * 设置选中项
   */
  setChosen(state, chosen) {
    state.chosen = CORE.isJSON(chosen) ? CORE.clone(chosen) : {}
  },

  // —————————————————————————————— 弹窗 —————————————————————————————— //

  /**
   * 打开下拉框弹窗
   */
  openSelect(state) {
    state.selectVisible = true
  },

  /**
   * 关闭下拉框弹窗
   */
  closeSelect(state) {
    state.selectVisible = false
  },

  // —————————————————————————————— 监听 —————————————————————————————— //

  /**
   * 开始远程下拉框
   */
  startSelect(state) {
    if (state.API.validSelectParam(state.selectParam, state, this)) {
      util.start('Select', state)
    } else {
      setStateSelect(state, []) // 重置下拉框
    }
  },

  /**
   * 完成远程下拉框
   */
  completeSelect(state, data) {
    let msgSuccess = ''
    if (CORE.isArray(data)) {
      if (CORE.isArray(data[0]) && CORE.isString(data[1])) {
        setStateSelect(state, data[0]) // 设置下拉框
        msgSuccess = data[1] // 成功消息
      } else {
        setStateSelect(state, data) // 设置下拉框
      }
    }
    util.complete('Select', state, msgSuccess)
  },

  /**
   * 终止远程下拉框
   */
  stopSelect(state, e) {
    setStateSelect(state, []) // 重置下拉框
    util.stop('Select', state, e)
  },
}

// ============================== 异步调用 ============================== //

const actions = {
  // —————————————————————————————— 下拉框 —————————————————————————————— //

  async remoteSelect(context) {
    const { state: { API, MAP, selectParam } } = context
    const TIP = API.transTip(MAP.tipSelect, this.state.API) // 拼上根模块 API 的菜单

    const myParam = await API.transSelectParam(selectParam, context)

    if (API.getSelect) {
      const arr = await API.getSelect(myParam, TIP)
      return API.transSelect(arr, context)
    }

    if (API.getList) {
      const [, arr] = await API.getList(myParam, TIP)
      return API.transSelect(arr, context)
    }
  },
}

// ============================== 导出仓库 ============================== //

export default { state, getters, mutations, actions }

// ============================== 内部方法 ============================== //

const setStateSelect = (state, select) => {
  // 普通下拉框
  if (!state.IS_SINGLE_SELECT) {
    util.setPageList(state, select, 'select')
    return
  }

  // 单例下拉框
  const SELECT = state.select

  const list = (select || []).map((item) => {
    const matched = SELECT.find(({ id }) => item.id === id) || {}
    return Object.assign(matched, item)
  })

  SELECT.splice(0, SELECT.length, ...list)
}
